# Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”，
# 而打开一个Socket需要知道目标计算机的IP地址和端口号，再指定协议类型即可
import socket
# AF_INET指定使用IPv4协议，如果要用更先进的IPv6，就指定为AF_INET6。SOCK_STREAM指定使用面向流的TCP协议
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建socket
# 80端口是Web服务的标准端口。MTP是25端口，FTP是21端口。端口号小于1024的是Internet标准服务的端口，大于1024的，可以任意使用。
s.connect(("www.sina.com.cn", 80))  # 建立连接，注意参数是一个tuple，包含地址和端口号。
s.send(b"GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n")  # 发送请求
buffer = []  # 接收数据
while True:
    d = s.recv(1024)  # recv(max)方法，一次最多接收指定的字节数
    if d:
        buffer.append(d)
    else:
        break
data = b"".join(buffer)
s.close()  # 关闭连接
header, html = data.split(b'\r\n\r\n', 1)
print(header)
with open('sina.html', 'wb') as f:  # # 把接收的数据写入文件:
     f.write(html)

# ----------------------------------------------------------------------------------------------------------测试客户端--
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
    # 发送数据:
    s.send(data)
    print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
